package br.com.foxinline.manager.relatorio;

import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.util.Msg;
import br.com.foxinline.vo.RelatorioSetorQuadraVO;
import java.net.URL;
import java.util.*;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.DualListModel;

/**
 *
 * @author laverson
 */
@ManagedBean
@ViewScoped
public class ManagerRelatorioSetorQuadra {

    @EJB
    ImovelServico imovelServico;
    @EJB
    PrefeituraServico prefeituraServico;
    @EJB
    CidadeServico cidadeServico;
    @EJB
    QuadraServico quadraServico;
    private Setor setor;
    private DualListModel<Quadra> quadras;
    private List<Quadra> quadrasSelecionadas;
    private List<RelatorioSetorQuadraVO> setoresQuadras = new ArrayList<RelatorioSetorQuadraVO>();
    private RelatorioSetorQuadraVO removerSetorQuadra;

    @PostConstruct
    public void init() {
        this.setor = new Setor();
        this.quadras = new DualListModel<Quadra>();
        this.quadrasSelecionadas = new ArrayList<Quadra>();
        this.removerSetorQuadra = new RelatorioSetorQuadraVO();
    }

    public void imprimirRelatorioPorSetorQuadra() {

        HashMap parametros = new HashMap();

        parametros.putAll(prefeituraServico.parametroPrefeitura());

        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        Map<String, Object> map;

        for (RelatorioSetorQuadraVO setorQuadra : setoresQuadras) {

            List<Object[]> result = imovelServico.pesquisarRelatorioSetorBairro(setorQuadra.getSetor().getNumero(), setorQuadra.getQuadras());

            for (Object[] objects : result) {

                map = new HashMap<String, Object>();

                map.put("setor", (Integer) objects[0]);
                map.put("quadra", (Integer) objects[1]);
                map.put("quantidade", (Long) objects[2]);

                list.add(map);
            }
        }

        parametros.put("titulo", "Quantidade de Imóveis");
        parametros.put("subTitulo", "Setor e Quadra");

        imovelServico.relatorioPorSetorQuadra(parametros, list);
    }

    public void adicionarSetorQuadra() {

        if (this.setor != null && this.setor.getId() != null) {

            boolean contemSetor = false;

            for (RelatorioSetorQuadraVO setorQuadraVO : this.setoresQuadras) {

                if (setorQuadraVO.getSetor().equals(this.setor)) {
                    setorQuadraVO.setQuadras(this.quadras.getTarget());
                    contemSetor = true;
                }
            }

            if (!contemSetor) {
                this.setoresQuadras.add(new RelatorioSetorQuadraVO(this.setor, this.quadras.getTarget()));
            }

            init();

        } else {
            Msg.messagemError("O campo Setor é obrigatório !");
        }
    }

    public void removerSetorQuadra() {
        this.setoresQuadras.remove(removerSetorQuadra);
        this.removerSetorQuadra = new RelatorioSetorQuadraVO();
    }

    public void editarSetorQuadra(RelatorioSetorQuadraVO setorQuadraVO) {

        this.setor = setorQuadraVO.getSetor();
        this.quadrasSelecionadas = setorQuadraVO.getQuadras();

        List<Quadra> quadrasDisponiveis = quadraServico.find(this.setor);

        quadrasDisponiveis.removeAll(this.quadrasSelecionadas);

        this.quadras = new DualListModel<Quadra>(quadrasDisponiveis, this.quadrasSelecionadas);

        this.removerSetorQuadra = setorQuadraVO;
        removerSetorQuadra();
    }

    public void atualizarQuadras() {

        for (RelatorioSetorQuadraVO relatorioSetorQuadraVO : this.setoresQuadras) {

            if (relatorioSetorQuadraVO.getSetor().equals(this.setor)) {
                this.quadrasSelecionadas = relatorioSetorQuadraVO.getQuadras();
            }
        }

        List<Quadra> quadrasDisponiveis = quadraServico.find(this.setor);

        quadrasDisponiveis.removeAll(this.quadrasSelecionadas);

        this.quadras = new DualListModel<Quadra>(quadrasDisponiveis, this.quadrasSelecionadas);
    }

    public String exibirQuadras(List<Quadra> quadras) {

        StringBuilder sb = new StringBuilder();
        sb.append("");

        if (quadras != null && !quadras.isEmpty()) {

            for (int i = 0; i < quadras.size(); i++) {

                if (quadras.size() > 1 && i > 0) {
                    if (i < quadras.size() - 1) {
                        sb.append(", ");
                    } else {
                        sb.append(" e ");
                    }
                }

                sb.append(quadras.get(i).getNumero());
            }
        }

        return sb.toString();
    }

    public Setor getSetor() {
        return setor;
    }

    public void setSetor(Setor setor) {
        this.setor = setor;
    }

    public DualListModel<Quadra> getQuadras() {
        return quadras;
    }

    public void setQuadras(DualListModel<Quadra> quadras) {
        this.quadras = quadras;
    }

    public List<Quadra> getQuadrasSelecionadas() {
        return quadrasSelecionadas;
    }

    public void setQuadrasSelecionadas(ArrayList<Quadra> quadrasSelecionadas) {
        this.quadrasSelecionadas = quadrasSelecionadas;
    }

    public List<RelatorioSetorQuadraVO> getSetoresQuadras() {
        return setoresQuadras;
    }

    public void setSetoresQuadras(List<RelatorioSetorQuadraVO> setoresQuadras) {
        this.setoresQuadras = setoresQuadras;
    }

    public RelatorioSetorQuadraVO getRemoverSetorQuadra() {
        return removerSetorQuadra;
    }

    public void setRemoverSetorQuadra(RelatorioSetorQuadraVO removerSetorQuadra) {
        this.removerSetorQuadra = removerSetorQuadra;
    }
}
